package com.android.openapp.data;


import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import android.location.Address;
import android.location.Geocoder;
import android.util.Log;

import com.socrata.data.View;
import com.socrata.data.View.Column;
import com.socrata.data.View.Row;

/**
 * 
 * @author Allieri Tommaso
 *
 */
public abstract class Place {
	/**
	 * da mettere in un arraylist (xml)
	 * Per inserire un novo dataset basta aggiungere il nome a datasetM[]
	 * listmetadati
	 * [0] musei - iu2c-9p5j
	 * [1] ostelli - 3b7c-6kcq
	 * [2] architetture - kf9b-rj2t
	 */
	public final static String DENOMINAZIONE="DENOMINAZIONE";
	public final static String TIPOLOGIA="TIPOLOGIA";
	public final static String INDIRIZZO="INDIRIZZO";
	
	public static Geocoder mGeoCoder;
	public static List<View> listmetadati=new ArrayList<View>();
	
	public static ArrayList<LinkedHashMap<String, String>> campiHashMap=new ArrayList<LinkedHashMap<String,String>>();
	
	public static String datasetM[];//=new String[] {"iu2c-9p5j","3b7c-6kcq","kf9b-rj2t"};
	public static List<Place> lista=new ArrayList<Place>();
	public Coordinate coord;
	public View metadata;
	public Row row;
	Map<String,Object> data;
	
	public Place() {
		
	}
	
	public static void setGeocoder(Geocoder g){
		Log.i("geocoder","init");
		mGeoCoder = g;
	}
	
	public static void initialize(){
		for(int i=0;i<datasetM.length;i++){
			listmetadati.add(new View());
			
		}
		Log.d("Initialize method","Completed");
		//museo
		LinkedHashMap<String, String> test=new LinkedHashMap<String, String>();
		test.put(DENOMINAZIONE, "MUSEO_DENOMINAZIONE");
		test.put(TIPOLOGIA,"MUSEO_TIPOLOGIA");
		test.put(INDIRIZZO,"SEDE_INDIRIZZO");
		campiHashMap.add(test);
		//ostello
		test=new LinkedHashMap<String, String>();
		test.put(DENOMINAZIONE, "DENOMINAZIONE");
		test.put(TIPOLOGIA,"COMUNE_PROVINCIA");
		test.put(INDIRIZZO,"INDIRIZZO");
		campiHashMap.add(test);
		//architettura
		test=new LinkedHashMap<String, String>();
		test.put(DENOMINAZIONE, "DENOMINAZIONE");
		test.put(TIPOLOGIA,"TIPO_ARCHITETTURA");
		test.put(INDIRIZZO,"INDIRIZZO");
		campiHashMap.add(test);
		//agriturismo
		test=new LinkedHashMap<String, String>();
		test.put(DENOMINAZIONE, "NOME_AGRITURISMO");
		test.put(TIPOLOGIA,"PRODOTTO");
		test.put(INDIRIZZO,"INDIRIZZO_COMPLETO");
		campiHashMap.add(test);
		//NLStorici
		test=new LinkedHashMap<String, String>();
		test.put(DENOMINAZIONE, "INSEGNA");
		test.put(TIPOLOGIA,"DEN_IMPRES");
		test.put(INDIRIZZO,"INDIR_ORIG");
		campiHashMap.add(test);
		//Fiera
		test=new LinkedHashMap<String, String>();
		test.put(DENOMINAZIONE, "MANIFESTAZIONE");
		test.put(TIPOLOGIA,"QUALIFICA");
		test.put(INDIRIZZO,"LOCALITA");
		campiHashMap.add(test);
		
		
		
	}
	
	public void addPlace(Place l){
		lista.add(l);
	}
	
	public static void setPlaces(List<Place> list){
		lista=list;
	}
	
	public Place getPlace(int index){
		return lista.get(index);
	}
	
	
	
	public abstract String getDenominazione();
	public abstract String getTipologia();
	
	//GETTER E SETTER
	
	public void setCoord(Double lat,Double lng){
		coord=new Coordinate(lat, lng);
	}
	public void setMetadata(View meta){
		this.metadata=meta;
	}
	public void setRow(Row row){
		this.row=row;
	}
	public void setMapData(Map<String,Object> data){
		this.data=data;
	}
	public void setCoord(String lat,String lng){
		if(lat != null && lng != null)
			coord = new Coordinate(lat, lng);
		else{
			String s = getAddress();
			try {
				Address a = mGeoCoder.getFromLocationName(s, 1).get(0);
				Log.v("place","Geocoding "+s);
				Double latitude = a.getLatitude();
				Double longitude = a.getLongitude();
				coord = new Coordinate(latitude, longitude);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			catch (NullPointerException e){
				coord = new Coordinate();
				Log.w("place", "no coordinates found for "+s);
			}
			catch (IllegalArgumentException e){
				coord = new Coordinate();
				Log.w("place", "no address found");
			}
		}
	}
	
	public Row getRow(){
		return row;
	}
	public View getMetadata(){
		return metadata;
	}
	
	public Double getLatitude(){
		return coord.getLatitudine();
	}
	public Double getLongitude(){
		return coord.getLongitudine();
	}
	public String getStringValue(String campo){
		return (String) data.get(Integer.toString(metadata.getColumnByIdentifier(campo).getId()));
	}
	
	@Override
	public abstract String toString();
	
	public abstract String getAddress();
	
	public abstract String getContactInfo();
	
}
